iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
自我挑戰組

asp.net可以變出那些功能系列 第 19

畫面自動加總與日期查詢:車輛用油/CRUD列表:水費

  • 分享至 

  • xImage
  •  

畫面自動加總與日期查詢:車輛用油
https://laihao2.com/Home/VEHICLE_OIL_List
https://ithelp.ithome.com.tw/upload/images/20240926/20119035j8jVk1YfYI.png

ASP.NET開發操作流程:資料表設定好>再寫程式:加入資料庫>串聯資料庫>產生Models裡面類別檔dao>按:建置>Controllers裡面的Entities>產生畫面View

資料表設定好>再寫程式:加入資料庫>串聯資料庫>

USE [ProductDB]
GO

/****** Object:  Table [dbo].[FireExtin]    Script Date: 2024/9/21 下午 04:07:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[FireExtin](
	[FE000] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
	[FE001] [nvarchar](50) NULL,
	[FE002] [decimal](18, 2) NULL,
	[FE003] [nvarchar](10) NULL,
	[FE004] [nvarchar](50) NULL,
	[FE005] [nvarchar](50) NULL,
	[FE006] [decimal](18, 2) NULL,
	[FE007] [nvarchar](10) NULL,
	[FE008] [nvarchar](10) NULL,
	[FE009] [nvarchar](30) NULL,
 CONSTRAINT [PK_FireExtin] PRIMARY KEY CLUSTERED 
(
	[FE000] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO



這個 SQL 腳本的作用是創建一個名為 [FireExtin] 的表,並對其進行一些約束和設置。下面對其進行詳細解釋:

1. USE [ProductDB]

這句代碼指定數據庫的上下文,將操作限定在 ProductDB 數據庫中。

2. SET ANSI_NULLS ON

該語句啟用 ANSI_NULLS,這意味著在查詢中使用 =<> 來比較 NULL 值時會遵循 ANSI 標準,即 NULL 與任何值比較都返回 UNKNOWN,包括與自身比較。

3. SET QUOTED_IDENTIFIER ON

此設置開啟 QUOTED_IDENTIFIER,允許使用雙引號來引用對象名稱(如列名或表名),而不將其視為字符串文本。

4. CREATE TABLE [dbo].[FireExtin]

創建一個名為 [FireExtin] 的表,位於數據庫的 dbo 架構下。

5. 表的各列定義:

  • [FE000] [decimal](18, 0) IDENTITY(1,1) NOT NULL: 這是一個 decimal 類型的列,長度為 18 位整數,無小數部分,並且是一個自增列(IDENTITY(1,1) 表示從 1 開始,每次遞增 1)。此列不能為 NULL,即必填。
  • NULL: 一個長度為 50 的可變字符列(nvarchar),允許存儲 Unicode 字符,可以為 NULL
  • [FE002] [decimal](18, 2) NULL: 這是一個 decimal 類型的列,最大長度為 18 位數,其中有 2 位小數,可以為 NULL
  • NULL: 一個長度為 10 的 nvarchar 列,可以為 NULL
  • NULL: 一個長度為 50 的 nvarchar 列,可以為 NULL
  • NULL: 一個長度為 50 的 nvarchar 列,可以為 NULL
  • [FE006] [decimal](18, 2) NULL: 一個 decimal 類型的列,最大長度為 18 位數,其中有 2 位小數,可以為 NULL
  • NULL: 一個長度為 10 的 nvarchar 列,可以為 NULL
  • NULL: 一個長度為 10 的 nvarchar 列,可以為 NULL
  • NULL: 一個長度為 30 的 nvarchar 列,可以為 NULL

6. 主鍵約束:

  • CONSTRAINT [PK_FireExtin] PRIMARY KEY CLUSTERED ([FE000] ASC):為 FE000 列設置主鍵(PRIMARY KEY),並使用聚集索引(CLUSTERED),表示這列中的每個值都是唯一的且不能為 NULL,並且數據會按照該列的順序存儲(ASC 表示升序排列)。

7. 索引選項:

  • WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF):這部分定義了索引的屬性,如是否填充索引頁、是否允許行鎖或頁鎖等。
    • PAD_INDEX = OFF:不對索引的填充因子進行額外填充。
    • STATISTICS_NORECOMPUTE = OFF:允許自動統計重新計算。
    • IGNORE_DUP_KEY = OFF:不忽略重覆的主鍵值。
    • ALLOW_ROW_LOCKS = ON:允許在索引上進行行級鎖定。
    • ALLOW_PAGE_LOCKS = ON:允許在索引上進行頁級鎖定。
    • OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF:不對順序鍵進行優化。

8. 存儲位置:

  • ON [PRIMARY]:表示表的數據和索引將存儲在默認的主文件組(PRIMARY)中。

總結:

此 SQL 腳本的功能是創建一個名為 FireExtin 的表,表中包含 10 列,其中 FE000 是自增的主鍵列,其余列是 nvarchardecimal 類型,並允許為空 (NULL)。
識別規格 選 是 才會自動增加
https://ithelp.ithome.com.tw/upload/images/20240926/20119035SYFJKzTtM0.png

產生Models裡面類別檔dao>按:建置>

namespace WebApplication5.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
    [Table("FireExtin")]
    public partial class FireExtin
    {
        [Display(Name = "滅火器名稱")]
        [StringLength(50)]
        public string FE001 { get; set; }


        [Display(Name = "數量")]
        [Column(TypeName = "numeric")]
        public decimal? FE002 { get; set; }

        [Display(Name = "位置")]
        [StringLength(10)]
        public string FE003 { get; set; }

        [Display(Name = "廠區")]
        [StringLength(50)]
        public string FE004 { get; set; }

        [Display(Name = "內含物")]
        [StringLength(50)]
        public string FE005 { get; set; }

        [Display(Name = "原始填充量(kg/瓶)")]
        [Column(TypeName = "numeric")]
        public decimal? FE006 { get; set; }

        [Display(Name = "管理部門")]
        [StringLength(10)]
        public string FE007 { get; set; }


        [StringLength(10)]
        public string FE008 { get; set; }

        [Display(Name = "相片連結")]
        [StringLength(30)]
        public string FE009 { get; set; }

        [Key]
        [Column(TypeName = "numeric")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public decimal FE000 { get; set; }
    }
}

解釋程式碼
這是一個使用 C# 和 Entity Framework 創建的模型類,名為 FireExtin,表示數據庫中的 FireExtin 表。它使用了 Data Annotations 來指定數據驗證和數據庫映射屬性。讓我們逐字段解釋這段代碼的含義:

[Table("FireExtin")]
public partial class FireExtin
  • Table("FireExtin"): 將這個類映射到數據庫中的 FireExtin 表。
  • public partial class FireExtin: 定義一個部分類 FireExtin,這個類可以與其他部分類合並,共同構成完整的類。

字段解釋:

  1. FE001:

    [Display(Name = "滅火器名稱")]
    [StringLength(50)]
    public string FE001 { get; set; }
    
    • Display(Name = "滅火器名稱"): 指定在用戶界面中顯示該字段的名稱為 "滅火器名稱"(滅火器名稱)。
    • StringLength(50): 限制該字段最多只能存儲 50 個字符。
    • public string FE001 { get; set; }: FE001 是一個字符串類型的字段,用於表示滅火器的名稱。
  2. FE002:

    [Display(Name = "數量")]
    [Column(TypeName = "numeric")]
    public decimal? FE002 { get; set; }
    
    • Display(Name = "數量"): 顯示名為 "數量"(數量)。
    • Column(TypeName = "numeric"): 指定數據庫中該字段的類型為 numeric
    • decimal? FE002 { get; set; }: FE002 是可為空的 decimal 類型,表示滅火器的數量。
  3. FE003:

    [Display(Name = "位置")]
    [StringLength(10)]
    public string FE003 { get; set; }
    
    • Display(Name = "位置"): 顯示名為 "位置"(位置)。
    • StringLength(10): 限制字符串長度為 10。
    • public string FE003 { get; set; }: 表示滅火器所在的具體位置。
  4. FE004:

    [Display(Name = "廠區")]
    [StringLength(50)]
    public string FE004 { get; set; }
    
    • Display(Name = "廠區"): 顯示名為 "廠區"(廠區)。
    • StringLength(50): 限制字符串長度為 50。
    • public string FE004 { get; set; }: 表示滅火器所在的廠區名稱。
  5. FE005:

    [Display(Name = "內含物")]
    [StringLength(50)]
    public string FE005 { get; set; }
    
    • Display(Name = "內含物"): 顯示名為 "內含物"(內含物)。
    • StringLength(50): 限制字符串長度為 50。
    • public string FE005 { get; set; }: 表示滅火器內部的材料或內容物。
  6. FE006:

    [Display(Name = "原始填充量(kg/瓶)")]
    [Column(TypeName = "numeric")]
    public decimal? FE006 { get; set; }
    
    • Display(Name = "原始填充量(kg/瓶)"): 顯示名為 "原始填充量(kg/瓶)"。
    • Column(TypeName = "numeric"): 指定數據庫類型為 numeric
    • decimal? FE006 { get; set; }: 表示滅火器的原始填充量(每瓶公斤數),可以為空。
  7. FE007:

    [Display(Name = "管理部門")]
    [StringLength(10)]
    public string FE007 { get; set; }
    
    • Display(Name = "管理部門"): 顯示名為 "管理部門"(管理部門)。
    • StringLength(10): 限制字符串長度為 10。
    • public string FE007 { get; set; }: 表示負責滅火器的管理部門。
  8. FE008:

    [StringLength(10)]
    public string FE008 { get; set; }
    
    • StringLength(10): 限制字符串長度為 10。
    • public string FE008 { get; set; }: 這個字段沒有指定顯示名稱,功能未說明,可能是預留的備用字段。
  9. FE009:

    [Display(Name = "相片連結")]
    [StringLength(30)]
    public string FE009 { get; set; }
    
    • Display(Name = "相片連結"): 顯示名為 "相片連結"(相片鏈接)。
    • StringLength(30): 限制字符串長度為 30。
    • public string FE009 { get; set; }: 表示與滅火器相關的照片鏈接。
  10. FE000:

    [Key]
    [Column(TypeName = "numeric")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public decimal FE000 { get; set; }
    
    • Key: 指定此字段為主鍵。
    • Column(TypeName = "numeric"): 數據庫中的字段類型為 numeric
    • DatabaseGenerated(DatabaseGeneratedOption.Identity): 指示數據庫自動生成此字段的值(自增主鍵)。
    • public decimal FE000 { get; set; }: 表示主鍵字段 FE000,用於唯一標識每個滅火器記錄。

總結

此類是用於表示 "滅火器" 表的數據模型,每個字段代表滅火器的屬性,包括名稱、數量、位置、內容物等。通過 Data Annotations 來限制字段長度、指定數據庫類型,以及提供顯示名和主鍵等功能。

這裡的ProductDBContext 參考前幾天,也是要填入


Controllers裡面的Entities>

public ActionResult FireExtin_List(string searchString)
        {
            ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";

            var fireExtins = _db.FireExtin.AsQueryable();

            if (!string.IsNullOrEmpty(searchString))
            {
                fireExtins = fireExtins.Where(fe => fe.FE001.Contains(searchString) ||
                                                    fe.FE002.ToString().Contains(searchString) ||
                                                    fe.FE003.Contains(searchString) ||
                                                    fe.FE004.Contains(searchString) ||
                                                    fe.FE005.Contains(searchString) ||
                                                    fe.FE006.ToString().Contains(searchString) ||
                                                    fe.FE007.Contains(searchString) ||
                                                    fe.FE008.Contains(searchString) ||
                                                    fe.FE009.Contains(searchString)
                                                    // 添加其他需要搜索的欄位
                                                    );
            }

            return View(fireExtins.ToList());
        }

解釋程式碼
這段代碼是一個 ASP.NET MVC 中的控制器方法 FireExtin_List,用於在前端顯示 FireExtin 表的數據列表,並提供搜索功能。以下是對這段代碼的詳細解釋:

  1. ActionResult FireExtin_List(string searchString):

    • 這是一個控制器中的動作方法,返回一個 ActionResult,表示一個頁面的響應。
    • 它接受一個名為 searchString 的字符串參數,用於從前端接收用戶的搜索關鍵詞。
  2. ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";:

    • 設置視圖使用的布局文件,指定使用 ~/Views/Shared/_Layout.cshtml 作為頁面的布局模板。
    • ViewBag 是一個動態的容器,用來將數據從控制器傳遞到視圖。
  3. var fireExtins = _db.FireExtin.AsQueryable();:

    • 從數據庫上下文 _db 中獲取 FireExtin 表的數據,生成一個 IQueryable 對象 fireExtins,表示可以對 FireExtin 數據集進行查詢和操作。
  4. if (!string.IsNullOrEmpty(searchString)):

    • 這里檢查 searchString 是否為空或 null,確保只有在用戶提供搜索關鍵詞時,才會執行後續的搜索邏輯。
  5. fireExtins = fireExtins.Where(...):

    • 使用 LINQ 查詢過濾 fireExtins 列表,檢查數據的多個字段是否包含 searchString
    • Where 方法會篩選出滿足條件的記錄,以下是對每個字段的過濾:
      • fe.FE001.Contains(searchString):檢查 FE001 字段是否包含 searchString
      • fe.FE002.ToString().Contains(searchString):將 FE002 字段轉換為字符串並檢查是否包含 searchString
      • 其他字段 (FE003, FE004, FE005, FE006, FE007, FE008, FE009) 也依次檢查它們是否包含 searchString
      • 在此基礎上,可以繼續添加其他需要搜索的字段。
  6. return View(fireExtins.ToList());:

    • 將篩選後的 fireExtins 數據轉換為列表,並通過 View() 方法將數據傳遞給視圖,最終渲染到前端頁面。

總結:

這段代碼實現了一個簡單的搜索功能,允許用戶在 FireExtin 表的多個字段中搜索匹配的記錄。如果用戶輸入了搜索關鍵詞,系統會在 FireExtin 的各個字段中查找包含該關鍵詞的記錄,並將結果顯示到前端頁面。

產生畫面View

@model IEnumerable<WebApplication5.Models.FireExtin>

@{
    /*Layout = null;*/
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h3>依照滅火器內容</h3>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>FireExtin_List</title>
</head>
<body>
    @*<p>
        @Html.ActionLink("Create New", "Create")
    </p>*@
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.FE001)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FE002)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FE003)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FE004)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FE005)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FE006)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FE007)
            </th>
            @*
            <th>
                @Html.DisplayNameFor(model => model.FE008)
            </th>*@
            <th>
                @Html.DisplayNameFor(model => model.FE009)
            </th>
            <th></th>
        </tr>

        @foreach (var item in Model)
        {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.FE001)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FE002)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FE003)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FE004)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FE005)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FE006)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FE007)
        </td>
        @*
        <td>
            @Html.DisplayFor(modelItem => item.FE008)
        </td>*@
        <td>
            @Html.DisplayFor(modelItem => item.FE009)
        </td>

        <td>
            @{
                //var imagePath = "~/files/" + item.FE009;
                //var imagePath = "~/templates/ColdCoal.jpg" + item.FE009;
                var imagePath = "~/templates/FireExtin.jpg";
                var imageUrl = Url.Content(imagePath);
                var imageFileName = item.FE009; // 使用 FE009 欄位中的檔案名稱
            }
            <a href="@imageUrl" target="_blank" title="@imageFileName">@imageFileName</a>


        </td>

        @*
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.FE000 }) |
            @Html.ActionLink("Details", "Details", new { id = item.FE000 }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.FE000 })
        </td>*@
    </tr>
        }

    </table>
</body>
</html>

解釋程式碼

這段程式碼是一個 ASP.NET MVC 的 Razor 視圖,用來顯示「車輛用油」的列表頁面,並包含加油種類的匯總以及資料篩選功能。讓我們分解一下它的關鍵部分:

  1. Model 宣告

    @model IEnumerable<WebApplication5.Models.VEHICLE_OIL>
    

    這行宣告了此視圖的模型是一個包含 VEHICLE_OIL 的集合,這個模型將用來顯示車輛用油的相關數據。

  2. Layout 設定

    Layout = "~/Views/Shared/_Layout.cshtml";
    

    設定使用共享的佈局檔案 _Layout.cshtml,將此視圖嵌入到通用的頁面結構中。

  3. 加油種類匯總

    <td>@Model.Where(m => m.OIL_TYPE == "汽油").Sum(m => m.LITERS)</td>
    <td>@Model.Where(m => m.OIL_TYPE == "柴油").Sum(m => m.LITERS)</td>
    

    在這裡,篩選模型中 OIL_TYPE 為「汽油」和「柴油」的項目,然後分別對 LITERS(公升數)進行加總,以顯示總油量。

  4. 日期篩選表單

    <form method="get" action="@Url.Action("VEHICLE_OIL_List", "Home")">
        <label for="startDate">開始日期:</label>
        <input type="date" name="startDate">
        <label for="endDate">結束日期:</label>
        <input type="date" name="endDate">
        <button type="submit">搜索</button>
    </form>
    

    提供開始日期和結束日期的輸入框,用戶可以輸入日期範圍進行搜尋。表單提交後會透過 GET 請求傳遞到 VEHICLE_OIL_List action。

  5. 資料表格顯示

    <table class="table">
        <tr>
            <th> 項次 </th>
            <th>@Html.DisplayNameFor(model => model.DOCUMENT_DATA)</th>
            <th>@Html.DisplayNameFor(model => model.CATEGORY)</th>
            <!-- 其他欄位略去 -->
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                <td>@(counter++)</td>
                <td>@Html.DisplayFor(modelItem => item.DOCUMENT_DATA)</td>
                <td>@Html.DisplayFor(modelItem => item.CATEGORY)</td>
                <!-- 其他欄位略去 -->
            </tr>
        }
    </table>
    

    這段程式碼會列出車輛用油的資料,通過 @foreach 遍歷 Model 來顯示每一筆數據的詳細內容。每個項目都會顯示例如 DOCUMENT_DATACATEGORYLITERS 等欄位。

  6. 隱藏的功能
    程式碼中有多處使用 @* ... *@ 將功能註解掉,比如:

    • 提交表單以新增計程車交通費申請和出差申請單的鏈接。
    • 顯示 PDF 檔案的鏈接功能,當某些條件符合時檢視 PDF。
  7. 樣式與排版

    <style>
        .align-right {
            text-align: right;
        }
    </style>
    

    加入了一個簡單的樣式,定義了 align-right 用來右對齊文字。不過目前在表格中還未使用。

總結:

此程式碼的功能包括:

  • 顯示車輛用油資料的表格。
  • 匯總特定油類的總加油量。
  • 支援通過日期篩選數據。
  • 預留了一些註解掉的功能,如新增計程車申請、檢視 PDF 文件等。

大家明天見~
/images/emoticon/emoticon01.gif


上一篇
顯示圖片連結:滅火器
下一篇
CRUD列表:水費
系列文
asp.net可以變出那些功能30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言